package com.fotkidemo.tasks;

import android.os.AsyncTask;
import android.util.Log;
import com.fotkidemo.BuildConfig;
import com.fotkidemo.beans.EntryElement;
import com.fotkidemo.network.NetworkUtil;
import com.fotkidemo.network.json.AbstractJsonEntryParser;
import com.fotkidemo.util.EntryCaches;
import com.fotkidemo.util.EntryElementCache;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * User: roma
 * Date: 6/25/12
 * Time: 4:59 PM
 * To change this template use File | Settings | File Templates.
 */

/**
 * Абстрактный класс представляет общую логику получения json-ответа от сервера по указанному адресу
 * и разбора данного ответа. Для каждой из задач создан отдельный класс,являющийся производным от AsyncTask,
 * т.е. каждая отдельная задача выполняется асинхронно.
 * @param <E> представляет либо альбом, либо картинку, в зависимости от реализации производного класса
 */
public abstract class DownloadAndParseEntryTask<E extends EntryElement> {
    public void execute(String url) {
        new DownloadEntryTask().execute(url);
    }

    /**
     * Вызывается по завершении выполнения задач получения и разбора json- ответа.
     * @param entries - Результат разбора json-ответа.
     */
    public abstract void onCompleteTask(List<E> entries);

    public abstract String getTag();

    /**
     * Получение конкретного json-парсера в зависимости конкретных entry-елементов, с которыми работает производный класс.
     * @param json - строка для разбора
     * @return - конкретный json-парсер
     */
    public abstract AbstractJsonEntryParser getJsonParser(String json);


    /**
     * Асинхронное выполнение запроса
     */
    private class DownloadEntryTask extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... urls) {
            try {
                return NetworkUtil.loadInfo(urls[0]);
            } catch (IOException e) {
                Log.e(getTag(), e.getMessage());
                return null;
            }
        }

        @Override
        protected void onPostExecute(String result) {
            if (result != null) {

                if (BuildConfig.DEBUG)
                    Log.d(getTag(), "Parse json entries");

                new ParseEntryTask().execute(result);
            }
        }
    }

    //Асинхронный разбор json ответа
    private class ParseEntryTask extends AsyncTask<String, Void, List<E>> {

        @Override
        protected List<E> doInBackground(String... jsons) {
            List<E> entries = new ArrayList<E>();
            AbstractJsonEntryParser entryParser = getJsonParser(jsons[0]);
            String cacheId = entryParser.parse();
            if (!cacheId.isEmpty()) {
                EntryElementCache<EntryElement> cache = EntryCaches.getInstance().getCache(cacheId);
                for (EntryElement element : cache.getValues()) {
                    entries.add((E) element);
                }
            }
            return entries;
        }

        @Override
        protected void onPostExecute(List<E> entries) {
            onCompleteTask(entries);
        }
    }
}
